package cn.hxzy.controller;


import cn.hxzy.common.ALiYunOSSProperties;
import cn.hxzy.common.OcrClient;
import cn.hxzy.common.OssUtil;
import cn.hxzy.common.Result;
import cn.hxzy.entity.DriverBack;
import cn.hxzy.entity.DriverFace;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import com.aliyun.ocr20191230.Client;
import com.aliyun.ocr20191230.models.*;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import cn.hutool.core.util.ObjectUtil;

import javax.annotation.Resource;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author Kuizhi.Ma
 * @since 2023-06-25
 * 驾驶证许可认证
 */
@RestController
@CrossOrigin
@RequestMapping("/tsDriversLicenseCertification")
public class TsDriversLicenseCertificationController {
    @Resource
    OSS ossClient;

    @Autowired
    private ALiYunOSSProperties aLiYunOSSProperties;

    //    上传驾驶证正面
    @RequestMapping("getDrivingFace")
    public Result getDrivingFace(@RequestParam MultipartFile file) {

//        调用工具类返回的图片路径
        String ossUrl = OssUtil.upload(file, OssUtil.FileDirType.ARTICLE_IMAGES);
        System.out.println("这是工具类返回的驾驶证正面图片路径-- " + ossUrl);
//        OCR验证的客户端
        Client client = OcrClient.getOCRClient();
        //驾驶证
        DriverFace driverFace = recognizeDriverLicenseFace(client, ossUrl);
        System.out.println(driverFace);
//        判断图片是否被识别
        if (ObjectUtil.isEmpty(driverFace.getAddress())) {
            System.out.println("如果返回驾驶证正面对象为空，则返回以下结果");
            return Result.error().code(415).message("图片类型不支持，请检查图片类型和内容 - 图像内容错误或格式不支持，请更换图片后重试，图像格式");
//
//            new OSSClientBuilder().build(aLiYunOSSProperties.getEndpoint(), aLiYunOSSProperties.getAccessKeyId(), aLiYunOSSProperties.getAccessKeySecret());
//            ossClient01.deleteObject(aLiYunOSSProperties.getBucketName(),fileName);
//            aLiYunOSSProperties.getBucketName(),fileName
        }
//        Map<String, DriverFace> map = new HashMap<>();
//        map.put(driverFace.getLicenseNumber(), driverFace);
        return Result.ok().data1(driverFace);
    }

    //    上传驾驶证反面
    @RequestMapping("getDrivingBack")
    public Result getDrivingBack(@RequestParam MultipartFile file) {

//        调用工具类返回的图片路径
        String ossUrl = OssUtil.upload(file, OssUtil.FileDirType.ARTICLE_IMAGES);
        System.out.println("这是工具类返回的驾驶证反面图片路径-- " + ossUrl);
//        OCR验证的客户端
        Client client = OcrClient.getOCRClient();

        //驾驶证
        DriverBack driverBack = recognizeDriverLicenseBack(client, ossUrl);
        System.out.println(driverBack);
        //        判断图片是否被识别
        if (ObjectUtil.isEmpty(driverBack.getCardNumber())) {
            return Result.error().code(415).message("图片类型不支持，请检查图片类型和内容 - 图像内容错误或格式不支持，请更换图片后重试，图像格式");
        }
        return Result.ok().data1(driverBack);
    }

    //    驾驶证资格
    @RequestMapping("getDrivingzige")
    public Result getDrivingzige(@RequestParam MultipartFile file) {
        //        调用工具类返回的图片路径
        String ossUrl = OssUtil.upload(file, OssUtil.FileDirType.ARTICLE_IMAGES);
        System.out.println("这是工具类返回的身份证资格图片路径-- " + ossUrl);
        return Result.ok().data1(ossUrl);
    }





    //驾驶证--正
    private static DriverFace recognizeDriverLicenseFace(Client client, String ossUrl) {
        DriverFace driverFace = new DriverFace();
        RecognizeDriverLicenseRequest request = new RecognizeDriverLicenseRequest()
                .setImageURL(ossUrl)
                .setSide("face");
        try {
            // 复制代码运行请自行打印 API 的返回值
            RecognizeDriverLicenseResponse recognizeDriverLicenseResponse = client.recognizeDriverLicense(request);
//            姓名
            driverFace.setName(recognizeDriverLicenseResponse.getBody().getData().getFaceResult().name);
//            住址
            driverFace.setAddress(recognizeDriverLicenseResponse.getBody().getData().getFaceResult().address);
//            性别
            driverFace.setGender(recognizeDriverLicenseResponse.getBody().getData().getFaceResult().gender);
//            证号
            driverFace.setLicenseNumber(recognizeDriverLicenseResponse.getBody().getData().getFaceResult().licenseNumber);
//            发证机构
            driverFace.setIssueDate(recognizeDriverLicenseResponse.getBody().getData().getFaceResult().issueDate);
//            准驾车型
            driverFace.setVehicleType(recognizeDriverLicenseResponse.getBody().getData().getFaceResult().vehicleType);
//            起始日期
            driverFace.setStartDate(recognizeDriverLicenseResponse.getBody().getData().getFaceResult().startDate);
//            过期日期
            driverFace.setEndDate(recognizeDriverLicenseResponse.getBody().getData().getFaceResult().endDate);
//            驾驶证正面信息： 姓名（name）   住址（address） 性别（gender） 证号（licenseNumber） 发证机构（issueUnit）
//                         初次领证日期（issueDate） 准驾车型（vehicleType） 起始日期（startDate） 过期日期（endDate）
        } catch (TeaException error) {
            // 如有需要，请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
            System.out.println(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 如有需要，请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
            System.out.println(error.message);
        }
        return driverFace;
    }

    //     驾驶证--反
    private static DriverBack recognizeDriverLicenseBack(Client client, String ossUrl) {
        DriverBack driverBack = new DriverBack();
        RecognizeDriverLicenseRequest request = new RecognizeDriverLicenseRequest()
                .setImageURL(ossUrl)
                .setSide("back");
        try {
            // 复制代码运行请自行打印 API 的返回值
            RecognizeDriverLicenseResponse recognizeDriverLicenseResponse = client.recognizeDriverLicense(request);
            System.out.println(recognizeDriverLicenseResponse.getBody().getData().getBackResult().archiveNumber);
            driverBack.setArchiveNumber(recognizeDriverLicenseResponse.getBody().getData().getBackResult().archiveNumber);
            driverBack.setCardNumber(recognizeDriverLicenseResponse.getBody().getData().getBackResult().cardNumber);
            driverBack.setName(recognizeDriverLicenseResponse.getBody().getData().getBackResult().name);
            driverBack.setRecord(recognizeDriverLicenseResponse.getBody().getData().getBackResult().record);
            //    驾驶证反面信息：档案编号（archiveNumber） 记录信息（record） 身份证日期（cardNumber） 姓名（name）
        } catch (TeaException error) {
            // 如有需要，请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
            System.out.println(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 如有需要，请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
            System.out.println(error.message);
        }
        return driverBack;
    }

}

